﻿//=============================================================================
//
// 背景 [bullet.cpp]
//
//=============================================================================
#include "bullet.h"
#include "input.h"
#include "background.h"


//*****************************************************************************
// マクロ定義
//*****************************************************************************

////////////////////////////
// 默认模型位置和尺寸
////////////////////////////

#define	BULLET_POS_X				( 300.0f )					// 背景の位置(Ｚ座標)
#define	BULLET_POS_Y				( 300.0f )					// 背景の位置(Ｚ座標)
#define	BULLET_SIZE_X				( 50 )						// 背景の幅
#define	BULLET_SIZE_Y				( 50 )						// 背景の高さ

////////////////////////////
// 01默认位置和尺寸
////////////////////////////
#define	BULLET_01_POS_X				( 300.0f )					// 背景の位置(Ｚ座標)
#define	BULLET_01_POS_Y				( 300.0f )					// 背景の位置(Ｚ座標)
#define	BULLET_01_SIZE_X			( 50.0f )					// 背景の幅
#define	BULLET_01_SIZE_Y			( 50.0f )					// 背景の高さ


// 图组坐标细分
#define	TEX_PATTERN_SIZE_X			( 1.0f / TEX_PATTERN_DIVIDE_X )		// １パターンのテクスチャサイズ(Ｘ方向)
#define	TEX_PATTERN_SIZE_Y			( 1.0f / TEX_PATTERN_DIVIDE_Y )		// １パターンのテクスチャサイズ(Ｙ方向)

////////////////////////////
// 4行4列图组动画
////////////////////////////
#define	TEX_PATTERN_DIVIDE_X5		( 5 )									// アニメーションパターンのテクスチャ内での分割数(Ｘ方向)
#define	TEX_PATTERN_DIVIDE_Y4		( 4 )									// アニメーションパターンのテクスチャ内での分割数(Ｙ方向)
#define	NUM_ANIM_PATTERN_X5_Y4		( TEX_PATTERN_DIVIDE_X5 * TEX_PATTERN_DIVIDE_Y4 )	// アニメーションのパターン数

#define	ANIM_PATTERN_UP				( 12 )
#define	ANIM_PATTERN_DOWN			( 0 )
#define	ANIM_PATTERN_LEFT			( 4 )
#define	ANIM_PATTERN_RIGHT			( 8 )



////////////////////////////
// 动画播放帧数
////////////////////////////
#define	TIME_CHANGE_PATTERN_BULLET		( 5 )												// アニメーションの切り替わるタイミング


//*****************************************************************************
// プロトタイプ宣言
//*****************************************************************************
HRESULT MakeVertexBullet( LPDIRECT3DDEVICE9 pDevice );

void SetVertexBullet(	int nIdx,									//记录当前对应的图组polygon地址
						float scaleX,								//X轴的放大参数
						float scaleY,								//Y轴的放大参数
						float sizeX,								//自身X轴的大小参数
						float sizeY );								//自身Y轴的大小参数

void SetTextureBullet(	int nIdx,									//记录当前对应的图组地址
						int nPatternAnim,							//记录当前显示帧
						int numAnimPattern, 						//记录当前对应的组成图组的图片数量
						int texPatternDivideX,						//记录当前图组X轴图片数量
						int texPatternDivideY );					//记录当前图组Y轴图片数量

void SetColorBullet( int nIdx, D3DCOLOR col_3 );

//*****************************************************************************
// グローバル変数
//*****************************************************************************
LPDIRECT3DTEXTURE9		g_pD3DTextureBullet[BULLET_TYPE_MAX] = {};		// テクスチャへのポインタ
LPDIRECT3DVERTEXBUFFER9 g_pD3DVtxBuffBullet = NULL;		// 頂点バッファインターフェースへのポインタ

BULLET g_bullet[BULLET_MAX];												//

//判断子弹是否以人物为中心移动
bool g_bIsBulletUp;
bool g_bIsBulletDown;
bool g_bIsBulletLeft;
bool g_bIsBulletRight;

// 计数器 上下左右分开计数
int						g_nCounterAnimBullet;							// ポリゴンのアニメーションカウンター

//记录图片帧
int						g_nPatternAnimBullet;						// ポリゴンのアニメーションパターンNo.


//动画播放开关
bool					g_isBulletAnimPlay;
bool					g_isBullet02AnimPlay;


//////////////////////
// 贴图的种类路径
//////////////////////
const char *c_pTextureBullet[BULLET_TYPE_MAX]=			//不同模式下的背景切换
{
	"data/TEXTURE/bullet/bullet_00.png",
	"data/TEXTURE/bullet/bullet_01.png",
};


//////////////////////
// 子弹放大缩小测试参数
//////////////////////
int g_i = 50;


//=============================================================================
// 初期化処理
//=============================================================================
HRESULT InitBullet( LPDIRECT3DDEVICE9 pDevice )
{
	for( int nCntBullet = 0; nCntBullet < BULLET_MAX; nCntBullet++ )
	{
		g_bullet[nCntBullet].pos = D3DXVECTOR3( BULLET_POS_X, BULLET_POS_Y, 0.0f );
		g_bullet[nCntBullet].move = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
		g_bullet[nCntBullet].type = -1;
		g_bullet[nCntBullet].status = -1;
		g_bullet[nCntBullet].animStatus = -1;
		g_bullet[nCntBullet].belongTo = -1;
		g_bullet[nCntBullet].bUse = false;
		g_bullet[nCntBullet].patternAnim = 0;
		g_bullet[nCntBullet].fRadius = BULLET_01_SIZE_X / 2;
		g_bullet[nCntBullet].bHit = false;
	}

	//计数器初始化
	g_nCounterAnimBullet = 0;

	// 动画帧初始化
	g_nPatternAnimBullet = 0;


	//动画播放开关初始化
	g_isBulletAnimPlay = false;
	g_isBullet02AnimPlay = false;

	//判断子弹是否以人物为中心移动
	g_bIsBulletUp = false;
	g_bIsBulletDown = false;
	g_bIsBulletLeft = false;
	g_bIsBulletRight = false;


	// 頂点情報の作成
	MakeVertexBullet( pDevice );

	// テクスチャの読み込み
	for( int nCntBullet = 0; nCntBullet < BULLET_TYPE_MAX; nCntBullet++ )
	{
		D3DXCreateTextureFromFile(	pDevice,								// デバイスへのポインタ
									c_pTextureBullet[nCntBullet],				// ファイルの名前
									&g_pD3DTextureBullet[nCntBullet] );		// 読み込むメモリー
	}



	//SetBullet(	D3DXVECTOR3( BULLET_POS_X, BULLET_POS_Y, 0.0f ),						// 位置
	//			D3DXVECTOR3( 5.0, 5.0, 0.0f ),											// 位移
	//			BULLET_01,								// 类型
	//			P1_SET );							// 属于哪个玩家




	return S_OK;
}

//=============================================================================
// 終了処理
//=============================================================================
void UninitBullet( void )
{
	for( int nCntBullet = 0; nCntBullet < BULLET_TYPE_MAX; nCntBullet++ )
	{
		if( g_pD3DTextureBullet[nCntBullet] != NULL )
		{// テクスチャの開放
			g_pD3DTextureBullet[nCntBullet]->Release();
			g_pD3DTextureBullet[nCntBullet] = NULL;
		}
	}

	if( g_pD3DVtxBuffBullet != NULL )
	{// 頂点バッファの開放
		g_pD3DVtxBuffBullet->Release();
		g_pD3DVtxBuffBullet = NULL;
	}
}

//=============================================================================
// 更新処理
//=============================================================================
void UpdateBullet(void)
{
	//获取地图位置信息
	BACKGROUND *backgroundPos = GetBGPos();

	for( int nCntBullet01 = 0; nCntBullet01 < BULLET_MAX; nCntBullet01++ )
	{
		if( g_bullet[nCntBullet01].bUse && g_bullet[nCntBullet01].type == BULLET_01 )
		{
			for( int nCntBullet02 = 0; nCntBullet02 < BULLET_MAX; nCntBullet02++ )
			{
				if( g_bullet[nCntBullet02].bUse && g_bullet[nCntBullet02].type == BULLET_02 )
				{
					float fLength;
					fLength = ( g_bullet[nCntBullet02].pos.x - g_bullet[nCntBullet01].pos.x ) * 
								( g_bullet[nCntBullet02].pos.x - g_bullet[nCntBullet01].pos.x ) +
								( g_bullet[nCntBullet02].pos.y - g_bullet[nCntBullet01].pos.y ) * 
								( g_bullet[nCntBullet02].pos.y - g_bullet[nCntBullet01].pos.y );

					//如果子弹碰到目标的时候
					if(fLength < ( g_bullet[nCntBullet02].fRadius + g_bullet[nCntBullet01].fRadius ) * 
						( g_bullet[nCntBullet02].fRadius + g_bullet[nCntBullet01].fRadius ) )
					{
						g_bullet[nCntBullet02].bHit = true;
					}
				}
			}
		}
	}


	//////////////////////////////
	// 子弹根据人物位置移动 判断
	//////////////////////////////
	//如果人物向【上】
	if( g_bIsBulletUp )
	{
		for( int nCntBullet = 0; nCntBullet < BULLET_MAX; nCntBullet++ )
		{
			if( g_bullet[nCntBullet].bUse )
			{
				g_bullet[nCntBullet].pos.y += 5;
			}
		}
		// 所有子弹都移动后在关闭判断开关
		g_bIsBulletUp = false;
	}

	//如果人物向【下】
	if( g_bIsBulletDown )
	{
		for( int nCntBullet = 0; nCntBullet < BULLET_MAX; nCntBullet++ )
		{
			if( g_bullet[nCntBullet].bUse )
			{
				g_bullet[nCntBullet].pos.y -= 5;
			}
		}
		// 所有子弹都移动后在关闭判断开关
		g_bIsBulletDown = false;
	}

	//如果人物向【左】
	if( g_bIsBulletLeft )
	{
		for( int nCntBullet = 0; nCntBullet < BULLET_MAX; nCntBullet++ )
		{
			if( g_bullet[nCntBullet].bUse )
			{
				g_bullet[nCntBullet].pos.x += 5;
			}
		}
		// 所有子弹都移动后在关闭判断开关
		g_bIsBulletLeft = false;
	}

	//如果人物向【右】
	if( g_bIsBulletRight )
	{
		for( int nCntBullet = 0; nCntBullet < BULLET_MAX; nCntBullet++ )
		{
			if( g_bullet[nCntBullet].bUse )
			{
				g_bullet[nCntBullet].pos.x -= 5;
			}
		}
		// 所有子弹都移动后在关闭判断开关
		g_bIsBulletRight = false;
	}



	//动画播放计数器
	g_nCounterAnimBullet++;								// ポリゴンのアニメーションカウンター
	for( int nCntBullet = 0; nCntBullet < BULLET_MAX; nCntBullet++ )
	{
		if( g_bullet[nCntBullet].bUse )
		{
			if( (g_nCounterAnimBullet % TIME_CHANGE_PATTERN_BULLET) == 0 )
			{
				g_bullet[nCntBullet].patternAnim = (g_bullet[nCntBullet].patternAnim + 1) % NUM_ANIM_PATTERN_X5_Y4;
			}
			//g_bullet[nCntBullet].pos += g_bullet[nCntBullet].move;


			/* ()()() */
				g_bullet[nCntBullet].circleO += g_bullet[nCntBullet].move;
				g_bullet[nCntBullet].pos.x = g_bullet[nCntBullet].circleO.x + cos(D3DX_PI / 180 * g_bullet[nCntBullet].degree) * g_bullet[nCntBullet].circleR / 2;
				g_bullet[nCntBullet].pos.y = g_bullet[nCntBullet].circleO.y + sin(D3DX_PI / 180 * g_bullet[nCntBullet].degree) * g_bullet[nCntBullet].circleR;

				g_bullet[nCntBullet].circleR += 1.0f;
				g_bullet[nCntBullet].degree += 5.0f;

				
				if(g_bullet[nCntBullet].degree >= 360.0f)
				{
					g_bullet[nCntBullet].degree = 0.0f;
					//放大系数归零
					g_i = 50;
				}
			/* ()()() */


			//如果子弹类型为1
			if( g_bullet[nCntBullet].type == BULLET_01 )
			{

				/* ()()() */
				//根据移动位置改变大小（试图2D做出3D感觉，有待商榷）
				if(g_bullet[nCntBullet].degree <= 180.0f)
				{
					g_i--;
					SetVertexBullet(nCntBullet, g_i, g_i, BULLET_01_SIZE_X, BULLET_01_SIZE_Y);
				}
				else
				{
					g_i++;
					SetVertexBullet(nCntBullet, g_i, g_i, BULLET_01_SIZE_X, BULLET_01_SIZE_Y);
				}
				/* ()()() */



				//SetVertexBullet(nCntBullet, 0, 0, BULLET_01_SIZE_X, BULLET_01_SIZE_Y);
			}

			//如果子弹类型为2，则看有没有和任意一个子弹1碰撞
			if( g_bullet[nCntBullet].type == BULLET_02 )
			{
				if( g_bullet[nCntBullet].bHit )
				{
					SetVertexBullet(nCntBullet, 50, 50, BULLET_01_SIZE_X, BULLET_01_SIZE_Y);
					g_bullet[nCntBullet].bHit = false;
				}
				else
				{
					SetVertexBullet(nCntBullet, 0, 0, BULLET_01_SIZE_X, BULLET_01_SIZE_Y);
				}
			}

			//SetVertexBullet(nCntBullet, 0, 0, BULLET_01_SIZE_X, BULLET_01_SIZE_Y);
			SetTextureBullet(nCntBullet, g_bullet[nCntBullet].patternAnim, NUM_ANIM_PATTERN_X5_Y4, TEX_PATTERN_DIVIDE_X5, TEX_PATTERN_DIVIDE_Y4);
		}
	}

}

//=============================================================================
// 描画処理
//=============================================================================
void DrawBullet( LPDIRECT3DDEVICE9 pDevice )
{
	// 頂点バッファをデバイスのデータストリームにバインド
	pDevice->SetStreamSource( 0, g_pD3DVtxBuffBullet, 0, sizeof(VERTEX_2D) );

	// 頂点フォーマットの設定
	pDevice->SetFVF( FVF_VERTEX_2D );

	for( int nCntBullet = 0; nCntBullet < BULLET_MAX; nCntBullet++ )
	{
		if( g_bullet[nCntBullet].bUse )
		{
			// テクスチャの設定
			pDevice->SetTexture( 0, g_pD3DTextureBullet[g_bullet[nCntBullet].type] );

			// ポリゴンの描画
			pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, (nCntBullet * 4), NUM_POLYGON );
		}
	}
}

//=============================================================================
// 頂点の作成
//=============================================================================
HRESULT MakeVertexBullet( LPDIRECT3DDEVICE9 pDevice )
{
	// オブジェクトの頂点バッファを生成
	if( FAILED( pDevice->CreateVertexBuffer(sizeof(VERTEX_2D) * NUM_VERTEX * BULLET_MAX,		// 頂点データ用に確保するバッファサイズ(バイト単位)
												D3DUSAGE_WRITEONLY,				// 頂点バッファの使用法　
												FVF_VERTEX_2D,					// 使用する頂点フォーマット
												D3DPOOL_MANAGED,				// リソースのバッファを保持するメモリクラスを指定
												&g_pD3DVtxBuffBullet,				// 頂点バッファインターフェースへのポインタ
												NULL)) )							// NULLに設定
	{
		return E_FAIL;
	}

	{//頂点バッファの中身を埋める
		VERTEX_2D *pVtx;

		// 頂点データの範囲をロックし、頂点バッファへのポインタを取得
		g_pD3DVtxBuffBullet->Lock(0, 0, (void**)&pVtx, 0);


		for( int nCntBullet = 0; nCntBullet < BULLET_MAX; nCntBullet++, pVtx += 4 )
		{
		// 頂点座標の設定
			//pVtx[0].vtx = D3DXVECTOR3(g_bullet[BULLET_MAX].pos.x - BULLET_SIZE_X / 2, g_bullet[BULLET_MAX].pos.y - BULLET_SIZE_Y / 2, 0.0f);
			//pVtx[1].vtx = D3DXVECTOR3(g_bullet[BULLET_MAX].pos.x + BULLET_SIZE_X / 2, g_bullet[BULLET_MAX].pos.y - BULLET_SIZE_Y / 2, 0.0f);
			//pVtx[2].vtx = D3DXVECTOR3(g_bullet[BULLET_MAX].pos.x - BULLET_SIZE_X / 2, g_bullet[BULLET_MAX].pos.y + BULLET_SIZE_Y / 2, 0.0f);
			//pVtx[3].vtx = D3DXVECTOR3(g_bullet[BULLET_MAX].pos.x + BULLET_SIZE_X / 2, g_bullet[BULLET_MAX].pos.y + BULLET_SIZE_Y / 2, 0.0f);

			// rhwの設定
			pVtx[0].rhw = 1.0f;
			pVtx[1].rhw = 1.0f;
			pVtx[2].rhw = 1.0f;
			pVtx[3].rhw = 1.0f;

			// 反射光の設定
			pVtx[0].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);
			pVtx[1].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);
			pVtx[2].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);
			pVtx[3].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);

			//// テクスチャ座標の設定
			//pVtx[0].tex = D3DXVECTOR2(0.0f, 0.0f);
			//pVtx[1].tex = D3DXVECTOR2(TEX_PATTERN_SIZE_X, 0.0f);
			//pVtx[2].tex = D3DXVECTOR2(0.0f, TEX_PATTERN_SIZE_Y);
			//pVtx[3].tex = D3DXVECTOR2(TEX_PATTERN_SIZE_X, TEX_PATTERN_SIZE_Y);

			// 頂点データをアンロックする
			g_pD3DVtxBuffBullet->Unlock();
		}
	}

	return S_OK;
}

void SetVertexBullet(	int nIdx,					//记录当前对应的图组polygon地址
						float scaleX,				//X轴的放大参数
						float scaleY,				//Y轴的放大参数
						float sizeX,				//自身X轴的大小参数
						float sizeY )				//自身Y轴的大小参数
{
	VERTEX_2D *pVtx;

	// 頂点データの範囲をロックし、頂点バッファへのポインタを取得
	g_pD3DVtxBuffBullet->Lock( 0, 0, (void**)&pVtx, 0 );

	pVtx += (nIdx * 4);

	// 頂点座標の設定
	// 这里的放大效果是以中心向四周放大
	pVtx[0].vtx = D3DXVECTOR3( g_bullet[nIdx].pos.x - scaleX - sizeX / 2, g_bullet[nIdx].pos.y - scaleY - sizeY / 2, 0.0f );
	pVtx[1].vtx = D3DXVECTOR3( g_bullet[nIdx].pos.x + scaleX + sizeX / 2, g_bullet[nIdx].pos.y - scaleY - sizeY / 2, 0.0f );
	pVtx[2].vtx = D3DXVECTOR3( g_bullet[nIdx].pos.x - scaleX - sizeX / 2, g_bullet[nIdx].pos.y + scaleY + sizeY / 2, 0.0f );
	pVtx[3].vtx = D3DXVECTOR3( g_bullet[nIdx].pos.x + scaleX + sizeX / 2, g_bullet[nIdx].pos.y + scaleY + sizeY / 2, 0.0f );


	// 頂点データをアンロックする
	g_pD3DVtxBuffBullet->Unlock();
}




void SetTextureBullet(	int nIdx,						//记录当前对应的图组地址
						int nPatternAnim,				//记录当前显示帧
						int numAnimPattern, 			//记录当前对应的组成图组的图片数量
						int texPatternDivideX,			//记录当前图组X轴图片数量
						int texPatternDivideY )			//记录当前图组Y轴图片数量
{
	{//頂点バッファの中身を埋める
		VERTEX_2D *pVtx;
		float fPosXLeft, fPosXRight;
		float fPosYUp, fPosYDown;

		// 頂点データの範囲をロックし、頂点バッファへのポインタを取得
		g_pD3DVtxBuffBullet->Lock(0, 0, (void**)&pVtx, 0);

		pVtx += (nIdx * 4);

		// テクスチャ座標の設定 纹理坐标设定
		fPosXLeft = (float)(nPatternAnim % texPatternDivideX) * 1.0f / texPatternDivideX;
		fPosXRight = (float)(nPatternAnim % texPatternDivideX) * 1.0f / texPatternDivideX + 1.0f / texPatternDivideX;
		fPosYUp = (float)(nPatternAnim / (numAnimPattern / texPatternDivideY)) * 1.0f / texPatternDivideY;
		fPosYDown = (float)(nPatternAnim / (numAnimPattern / texPatternDivideY)) * 1.0f / texPatternDivideY + 1.0f / texPatternDivideY;

		pVtx[0].tex = D3DXVECTOR2(fPosXLeft, fPosYUp);
		pVtx[1].tex = D3DXVECTOR2(fPosXRight, fPosYUp);
		pVtx[2].tex = D3DXVECTOR2(fPosXLeft, fPosYDown);
		pVtx[3].tex = D3DXVECTOR2(fPosXRight, fPosYDown);

		// 頂点データをアンロックする
		g_pD3DVtxBuffBullet->Unlock();
	}
}

void SetColorBullet( int nIdx, D3DCOLOR col_3 )
{
	VERTEX_2D *pVtx;

	// 頂点データの範囲をロックし、頂点バッファへのポインタを取得
	g_pD3DVtxBuffBullet->Lock(0, 0, (void**)&pVtx, 0);

	pVtx += ( nIdx * 4 );

	// 頂点座標の設定
	pVtx[0].diffuse =
	pVtx[1].diffuse =
	pVtx[2].diffuse =
	pVtx[3].diffuse = col_3;

	// 頂点データをアンロックする
	g_pD3DVtxBuffBullet->Unlock();
}


void SetBullet( D3DXVECTOR3 pos,						// 位置
				D3DXVECTOR3 move,						// 位移
				int nType,								// 类型
				int belongTo )							// 属于哪个玩家
{
	for( int nCntBullet = 0; nCntBullet < BULLET_MAX; nCntBullet++ )
	{
		if( !g_bullet[nCntBullet].bUse )
		{
			g_bullet[nCntBullet].pos = pos;
			g_bullet[nCntBullet].circleO = pos;
			g_bullet[nCntBullet].degree = 0.0f;
			g_bullet[nCntBullet].circleR = 10.0f;
			g_bullet[nCntBullet].move = move;
			g_bullet[nCntBullet].belongTo = belongTo;
			g_bullet[nCntBullet].type = nType;


			//SetVertexBullet(nType, 0, 0, BULLET_01_SIZE_X, BULLET_01_SIZE_Y);

			




			//switch(g_bullet[nCntBullet].nType)
			//{
			//case ENEMYTYPE_000:
			//	break;

			//case ENEMYTYPE_001:
			//	break;

			//case ENEMYTYPE_002:
			//	break;

			//case ENEMYTYPE_003:
			//	break;
			//}

			g_bullet[nCntBullet].bUse = true;

			break;
		}
	}
}

BULLET *GetBulletPos(void)
{
	return &g_bullet[0];
}


bool *GetIsBulletUp(void)
{
	return &g_bIsBulletUp;
}

bool *GetIsBulletDown(void)
{
	return &g_bIsBulletDown;
}

bool *GetIsBulletLeft(void)
{
	return &g_bIsBulletLeft;
}

bool *GetIsBulletRight(void)
{
	return &g_bIsBulletRight;
}